#pragma once
#include <iostream>
#include <string>
#include <math.h>
#include <unistd.h>  //引入Windows库
#include <thread>  //引入线程
#include <sstream>
using namespace std;

//电梯开门时间
#define OPEN_TIME 1
//电梯上升时间
#define UP_TIME 1

//电梯状态
enum State
{
	Up,
	Down,
	Wait,
};
static int ElevatorSum = 4;			//电梯总数
static bool Up_Button = false;		//向上按钮
static bool Down_Button = false;	//向下按钮
static bool Stop_Timer = false;		//暂停时间

class Elevator
{
public:
	Elevator();
	~Elevator();
	int Get_MinFloor();				//获取最低楼层值
	int Get_MaxFloor();				//获取最高楼层值
	int Get_FloorNum();				//获取楼层总数
	int Get_StopFloor();			//获取当前停止楼层
	void Set_StopFloor(int floor);	//设置电梯当前停止楼层
	void Set_FloorSection(int min, int max);			//设置可到达的楼层区间
	void Set_MaxWeigh(float num);	//设置最大载重量
	void Show_Elevator();			//显示当前电梯信息
	string Transform_Enum(State curr);					//转换电梯状态
	void Run_Elevator(string dir);	//电梯运行
	void Print_Line(int leng);		//打印横线
	void Open_Door();				//开门操作
	void Input_FloorBtn(Elevator* ele);					//楼层按钮操作
public:
	bool Up_State = false;			//上行状态
	bool Down_State = false;		//下行状态
	State Current_State = Wait;		//电梯当前状态
	int Run_Step = 1;				//上升步进值
 	int* Floor_Btn = nullptr;		//按下的楼层按钮
	string Elevator_Name = "";		//电梯名称
	string Index_Tag = "E";			//遍历标识
private:
	int Floor_Num = 21;				//楼层总数
	int Minimun_Floor = 0;			//可达到最低楼层 0层为地下一层
	int Higest_Floor = 21;			//可达到最高楼层
	int Stop_Floor = 0;				//当前停止楼层 默认值给0
	float Weight_Max = 800;			//最大载重量
	string Door_State = "关闭";		//电梯门开闭
};

////获取电梯个数
//template<class T>
//int Get_ArrayLength(T& arr);

//选择电梯
extern void Choice_Elevator(Elevator* ele[]);
//定时器
extern void  Timer(void(*call)(Elevator* arr[]), Elevator* ele[], int interval);


template<class T>
extern int Get_ArrayLength(T& arr)
{
	return sizeof(arr) / sizeof(arr[0]);
}